package com.ruoyi.charge.utils;

import java.nio.ByteBuffer;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.Arrays;
 
public class CP56Time2a {
    
    // 编码当前时间为 CP56Time2a 格式
    public static byte[] encodeCP56Time2a(LocalDateTime dateTime) {
        ByteBuffer buffer = ByteBuffer.allocate(7);
        
        // 毫秒部分，1分钟 = 60,000毫秒
        int millis = (dateTime.getSecond() * 1000) + (dateTime.getNano() / 1000000);
        buffer.putShort((short) millis);
 
        // 分钟 (6 bits) + 有效性位 (1 bit)
        byte minute = (byte) dateTime.getMinute();
        buffer.put(minute);
 
        // 小时 (5 bits)
        byte hour = (byte) dateTime.getHour();
        buffer.put(hour);
 
        // 天 (5 bits) + 工作日标志 (1 bit)
        byte day = (byte) dateTime.getDayOfMonth();
        buffer.put(day);
 
        // 月份 (4 bits)
        byte month = (byte) dateTime.getMonthValue();
        buffer.put(month);
 
        // 年 (7 bits, 两位数年份)
        byte year = (byte) (dateTime.getYear() % 100);
        buffer.put(year);
        
        return buffer.array();
    }
 
    // 解码 CP56Time2a 格式为 LocalDateTime
    public static LocalDateTime decodeCP56Time2a(byte[] data) {
        ByteBuffer buffer = ByteBuffer.wrap(data);
        
        // 毫秒部分
        int millis = buffer.getShort() & 0xFFFF;
        int seconds = millis / 1000;
        int nanos = (millis % 1000) * 1000000;
 
        // 分钟
        int minute = buffer.get() & 0x3F;
 
        // 小时
        int hour = buffer.get() & 0x1F;
 
        // 天
        int day = buffer.get() & 0x1F;
 
        // 月
        int month = buffer.get() & 0x0F;
 
        // 年
        int year = 2000 + (buffer.get() & 0x7F);
        
        return LocalDateTime.of(year, month, day, hour, minute, seconds, nanos);
    }
 
    public static void main(String[] args) {
        // 获取当前时间
        LocalDateTime currentTime = LocalDateTime.now(ZoneOffset.UTC);
        System.out.println("当前时间: " + currentTime);
 
        // 编码当前时间为CP56Time2a格式
        byte[] encodedTime = encodeCP56Time2a(currentTime);
        System.out.println("编码后的CP56Time2a格式: " + Arrays.toString(encodedTime));
 
        // 解码回LocalDateTime
        LocalDateTime decodedTime = decodeCP56Time2a(encodedTime);
        System.out.println("解码后的时间: " + decodedTime);
    }
}